package com.feinno.urcs.group.service;

import com.feinno.urcs.group.api.GroupMessageLogService;
import com.feinno.urcs.group.entity.GroupFileInfo;
import com.feinno.urcs.group.entity.GroupInfo;
import com.feinno.urcs.group.entity.GroupMember;
import com.feinno.urcs.group.entity.GroupMessageType;
import com.feinno.urcs.group.interop.entity.FetionFileMessageArgs;
import com.feinno.urcs.group.interop.entity.FetionTextMessageArgs;
import com.feinno.urcs.group.log.*;
import com.feinno.urcs.group.pctask.task.AndPcGroupMsgArgs;
import com.feinno.urcs.types.MobileNo;
import org.helium.framework.annotations.ServiceImplementation;
import org.helium.framework.annotations.TaskEvent;
import org.helium.framework.task.TaskProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Li.Hongbo <lihongbo@feinno.com>
 */

@ServiceImplementation
public class GroupMessageLogServiceImpl implements GroupMessageLogService {
	@TaskEvent(MessageLogArgs.TASK_EVENT_NAME)
	private TaskProducer<MessageLogArgs> groupMsgLogTask;

	private static final Logger LOGGER = LoggerFactory.getLogger(GroupMessageLogServiceImpl.class);


	public void textMessageUpstreamLog(String messageId, MobileNo sender, GroupInfo groupInfo, String clientType, MessageDirection messageDirection, MessageContentType contentType, String messageContent, Date messageDateTime) {

		try {
			List<GroupMember> peerMembers = getMemberList(groupInfo, sender);
			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setMessageId(messageId) //TODO //varchar(128)  消息ID
					.setOwnerUri(sender.toTelUri().toString())//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
//					.setOwnerSite("") //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(groupInfo.getGroupSipUri().toString())//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
//					.setPeerSite("") //varchar(10) BF- 北方 NF-南方
					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(sender.toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent(clientType) //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
//					.setClientIp("") // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(messageDirection) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.SESSIONMODE) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(contentType)// MessageContentType
					.setContent(messageContent) //varchar(1024)  消息内容
//					.setFileSize(0)  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(200) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
//					.setReason("")  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
//					.setMessageFlux(0)
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("GroupMessageLogger error ,messageId =%s GroupId=%s sender=%s clientType=%s content=%s ", messageId, groupInfo.getGroupId(), sender, clientType, messageContent), e);
		}


	}

	public void textMessageDownstreamLog(String messageId, MobileNo sender, String receiverUri, String receiverSite, String groupUri, String clientType, MessageDirection messageDirection, MessageContentType contentType, String messageContent, Date messageDateTime, String clientIP, int statusCode, String reason) {
		try {
//			List<GroupMember> peerMembers = getMemberList(groupInfo, sender);
			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setMessageId(messageId) //TODO //varchar(128)  消息ID
					.setOwnerUri(receiverUri)//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
					.setOwnerSite(receiverSite) //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(groupUri)//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
					.setPeerSite(receiverSite) //varchar(10) BF- 北方 NF-南方
//					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
//					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(sender.toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent(clientType) //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
					.setClientIp(clientIP) // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(messageDirection) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.SESSIONMODE) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(contentType)// MessageContentType
					.setContent(messageContent) //varchar(1024)  消息内容
//					.setFileSize(0)  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(statusCode) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
					.setReason(reason)  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
//					.setMessageFlux(0)
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("GroupMessageLogger error ,messageId =%s groupUri=%s sender=%s clientType=%s content=%s ", messageId, groupUri, sender, clientType, messageContent), e);
		}


	}

	public void textMessageDownstreamLogOffline(String messageId, MobileNo sender, String receiverUri, String receiverSite, String groupUri, String clientType, MessageDirection messageDirection, MessageContentType contentType, String messageContent, Date messageDateTime, String clientIP, int statusCode, String reason) {

		try {
//			List<GroupMember> peerMembers = getMemberList(groupInfo, sender);
			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setMessageId(messageId) //TODO //varchar(128)  消息ID
					.setOwnerUri(receiverUri)//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
					.setOwnerSite(receiverSite) //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(groupUri)//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
					.setPeerSite(receiverSite) //varchar(10) BF- 北方 NF-南方
//					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
//					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(sender.toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent(clientType) //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
					.setClientIp(clientIP) // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(messageDirection) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.SESSIONMODE) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(contentType)// MessageContentType
					.setContent(messageContent) //varchar(1024)  消息内容
//					.setFileSize(0)  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(statusCode) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
					.setReason(reason)  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
					.setMessageExtend("offline")
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("GroupMessageLogger error ,messageId =%s groupUri=%s sender=%s clientType=%s content=%s ", messageId, groupUri, sender, clientType, messageContent), e);
		}


	}

	public void fileMessageUpstreamLog(String messageId, MobileNo sender, GroupInfo groupInfo, String clientType, MessageDirection messageDirection, GroupFileInfo groupFileInfo, Date messageDateTime) {

		try {
			List<GroupMember> peerMembers = getMemberList(groupInfo, sender);

			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setMessageId(messageId) //TODO //varchar(128)  消息ID
					.setOwnerUri(sender.toTelUri().toString())//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
					.setOwnerSite("FETION") //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(groupInfo.getGroupSipUri().toString())//  上行 下行（群对端Url(群组/公众号/群发管理员等)
//					.setPeerSite("") //varchar(10) BF- 北方 NF-南方
					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(sender.toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent(clientType) //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
//					.setClientIp("") // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(messageDirection) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.FT) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(MessageContentType.parse(groupFileInfo))// MessageContentType
//					.setContent("") //varchar(1024)  消息内容
					.setFileSize(groupFileInfo.getFileSize())  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(200) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
//					.setReason("")  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
					.setMessageExtend(groupFileInfo.getFileName())
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("GroupMessageLogger file error , GroupId=%s sender=%s clientType=%s GroupFileInfo=%s ", messageId, groupInfo.getGroupId(), sender, clientType, groupFileInfo), e);
		}


	}

	public void fileMessageDownstreamLog(String messageId, MobileNo sender, String receiverUri, String receiverSite, String groupUri, String clientType, MessageDirection messageDirection, GroupFileInfo groupFileInfo, Date messageDateTime, String accessAddress, String clientIP, int statusCode, String reason) {

		try {

			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setMessageId(messageId) //TODO //varchar(128)  消息ID
					.setOwnerUri(receiverUri)//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
					.setOwnerSite(receiverSite) //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(groupUri)//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
//					.setPeerSite("") //varchar(10) BF- 北方 NF-南方
//					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
//					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(sender.toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent(clientType) //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
					.setClientIp(clientIP) // varchar(128) 终端IP地址 P-NetWork-Info
					.setAccessAddress(accessAddress) //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(messageDirection) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.FT) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(MessageContentType.parse(groupFileInfo))// MessageContentType
//					.setContent("") //varchar(1024)  消息内容
					.setFileSize(groupFileInfo.getFileSize())  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(statusCode) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
					.setReason(reason)  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
					.setMessageExtend(groupFileInfo.getFileName())
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("GroupMessageLogger file error , groupUri=%s sender=%s clientType=%s GroupFileInfo=%s ", messageId, groupUri, sender, clientType, groupFileInfo), e);
		}


	}

	@Override
	public void andPcMessageDownstreamLog(AndPcGroupMsgArgs args, int statusCode, String reason, Date messageDateTime) {
		try {
			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setOwnerUri(args.getToMobile().toTelUri().toString())//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
					.setOwnerSite("PC") //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(args.getGroupId() + "@" + args.getDomain())//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
					.setPeerSite("PC") //varchar(10) BF- 北方 NF-南方
//					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
//					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(args.getSender().toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent("PC") //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
//					.setClientIp(server) // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress(server) //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(MessageDirection.DOWN) // 消息方向
//					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setStatusCode(statusCode) //上行（200|下行（MSRP-SUCCESS:200, MSRP-FAILED,MSRP错误码)|200下行成功|202 服务器代收成功
					.setReason(reason)  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
			;

			if (GroupMessageType.TEXT.equals(args.getContentType())) {
				msgLog
						.setMessageId("") //TODO //varchar(128)  消息ID
						.setMessageKindType(MessageKindType.SESSIONMODE) // * 下行 :1-PageMode|2-LargeMode|3-FT|4-Session
						.setContentType(MessageContentType.TXT)// MessageContentType
						.setContent(new String(args.getContent())) //varchar(1024)  消息内容
				;
			} else {
				msgLog
						.setMessageId("") //TODO //varchar(128)  消息ID
						.setMessageKindType(MessageKindType.FT) // * 下行 :1-PageMode|2-LargeMode|3-FT|4-Session
						.setContentType(MessageContentType.parse(args.getContentType()))// MessageContentType
						.setFileSize(args.getFileSize())  // int 消息大小(文件传输时，为文件大小)
						.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
						.setMessageExtend(args.getUrl())
				;
			}
			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("andPcMessageDownstreamLog error , args =%s,status=%s, reason=%s", args, statusCode, reason), e);
		}

	}

	@Override
	public void fetionFileMessageDownstreamLog(FetionFileMessageArgs args, int statusCode, String reason, Date messageDateTime) {
		try {

			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
//					.setMessageId(args) //TODO //varchar(128)  消息ID
					.setOwnerUri(args.getGroup().getGroupId() + "@fetion.com.cn")//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
//					.setOwnerSite("") //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(args.getGroup().getGroupId() + "@fetion.com.cn")//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
					.setPeerSite("FETION") //varchar(10) BF- 北方 NF-南方
					.setReferBy(args.getGroup().getOperatorMobileNo().toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent("FETION") //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
//					.setClientIp("") // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(MessageDirection.DOWN) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.FT) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(MessageContentType.parse(args.getContentType()))// MessageContentType
//					.setContent(args.getContent()) //varchar(1024)  消息内容
					.setFileSize((int) args.getFileSize())  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(statusCode) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
					.setReason(reason)  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
					.setMessageExtend(args.getUrl())
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format(" error ,args =%s  statusCode=%s reason=%s ", args, statusCode, statusCode, reason), e);
		}
	}

	@Override
	public void fetionTextMessageDownstreamLog(FetionTextMessageArgs args, int statusCode, String reason, Date messageDateTime) {
		try {

			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
//					.setMessageId(args) //TODO //varchar(128)  消息ID
					.setOwnerUri(args.getGroup().getGroupId() + "@fetion.com.cn")//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
//					.setOwnerSite("") //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(args.getGroup().getGroupId() + "@fetion.com.cn")//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
					.setPeerSite("FETION") //varchar(10) BF- 北方 NF-南方
					.setReferBy(args.getGroup().getOperatorMobileNo().toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent("FETION") //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
//					.setClientIp("") // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(MessageDirection.DOWN) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.SESSIONMODE) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(MessageContentType.parse(args.getContentType()))// MessageContentType
					.setContent(new String(args.getContent())) //varchar(1024)  消息内容
//					.setFileSize(0)  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(statusCode) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
					.setReason(reason)  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("  error ,args =%s  statusCode=%s reason=%s ", args, statusCode, statusCode, reason), e);
		}

	}

	public void fileMessageUpstreamLogBeforeDownLoad(String messageId, MobileNo sender, GroupInfo groupInfo, String clientType, MessageDirection messageDirection, GroupFileInfo groupFileInfo, Date messageDateTime) {

		try {
			List<GroupMember> peerMembers = getMemberList(groupInfo, sender);

			MessageLogArgs msgLog = new MessageLogArgs();
			msgLog
					.setMessageId(messageId) //TODO //varchar(128)  消息ID
					.setOwnerUri(sender.toTelUri().toString())//上行（发送者）|下行（接收者，如果是飞信，OwnerUri=groupId@fetion.com.cn） varchar(128) 所有者Uri
//					.setOwnerSite("") //TODO  下行 varchar(10)  BF-北方 NF-南方
					.setPeerUri(groupInfo.getConversationId())//  上行  下行（群）  varchar(128) 对端Url(群组/公众号/群发管理员等)
//					.setPeerSite("") //varchar(10) BF- 北方 NF-南方
					.setPeerUriList(getMemberListStr(peerMembers)) //varchar(1000) 接收方列表 仅出现在群发消息上行
					.setPeerUriListCount(peerMembers.size()) //上行 群消息转发的成员数量
					.setReferBy(sender.toTelUri().toString()) // 上行 下行（发消息的人）  varchar(128)  群组消息发送方uri
					.setUserAgent(clientType) //上行（APP，PC，FETION） | 下行（APP，PC, *FETION）  varchar(128) 所有者的客户端的类型
//					.setClientIp("") // varchar(128) 终端IP地址 P-NetWork-Info
//					.setAccessAddress("") //varchar(128) 接入地址:SBC/P-CSCF
					.setMessageDirection(messageDirection) // 消息方向
					.setMessageType(MessageType.GROUP) // 消息类型
//					.setMessageFlags(0) // bit 0：静默标记
					.setMessageKindType(MessageKindType.SESSIONMODE) // * 下行 :1 - PageMode |  2 - LargeMode  3 - FT |  4 - Session
					.setContentType(MessageContentType.parse(groupFileInfo))// MessageContentType
//					.setContent("") //varchar(1024)  消息内容
					.setFileSize(groupFileInfo.getFileSize())  // int 消息大小(文件传输时，为文件大小)
					.setStatusCode(200) //上行（200） |  下行（MSRP-SUCCESS: 200, MSRP-FAILED, MSRP，错误码)| 200 下行成功 | 202 服务器代收成功
//					.setReason("")  //下行（自己编）  varchar(128)  原因
					.setMessageTime(messageDateTime) //上行  下行(收到应答的时间）  datetime 消息时间
					.setMessageExtend(groupFileInfo.getFileName())
			;

			groupMsgLogTask.produce(msgLog);
		} catch (Exception e) {
			LOGGER.error(String.format("GroupMessageLogger file error , GroupId=%s sender=%s clientType=%s GroupFileInfo=%s ", messageId, groupInfo.getGroupId(), sender, clientType, groupFileInfo), e);
		}


	}

	private List<GroupMember> getMemberList(GroupInfo info, MobileNo exceptMember) {

		List<GroupMember> peerMemberList = new ArrayList<>();
		for (GroupMember member : info.getMembers()) {
			if (member.getIdentity() == 61) continue;
			if (exceptMember.equals(member.getMobileNo())) continue;
			peerMemberList.add(member);

		}
		return peerMemberList;

	}

	private String getMemberListStr(List<GroupMember> members) {
		StringBuilder sb = new StringBuilder();
		for (GroupMember member : members) {
			sb.append(member.getMobileNo()).append(",");
		}
		return sb.toString();
	}
}
